package com.payment.common.wxutils;

import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 微信H5支付工具类 创建者 创建时间 2017年7月31日
 */
public class MobileUtil {

	/**
	 * access_token是公众号的全局唯一接口调用凭据，公众号调用各接口时都需使用access_token。
	 * 开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。
	 * access_token的有效期目前为2个小时，需定时刷新，重复获取将导致上次获取的access_token失效。
	 * @param appId
	 * @param appSecret
	 * @return
	 */
	public static String getAccessToken(String appId,String appSecret) {
		String url = "https://api.weixin.qq.com/cgi-bin/token?" +
				"grant_type=client_credential&appid="+appId+"&secret="+appSecret;
		JSONObject json = JSONObject.parseObject(com.payment.common.utils.HttpUtil.sendGet(url,"","UTF-8"));
		if (null != json) {
			if (null != json.get("access_token")) {
				return (String) json.get("access_token");
			}
		}
		return null;
	}

	/**
	 * jsapi_ticket是公众号用于调用微信JS接口的临时票据。
	 * 正常情况下，jsapi_ticket的有效期为7200秒，通过access_token来获取。
	 * 由于获取jsapi_ticket的api调用次数非常有限，频繁刷新jsapi_ticket会导致api调用受限，影响自身业务，开发者必须在自己的服务全局缓存jsapi_ticket 。
	 * @param accessToken
	 * @return
	 */
	public static String getTicket(String accessToken){
		String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=jsapi";
		JSONObject json = JSONObject.parseObject(com.payment.common.utils.HttpUtil.sendGet(url,"","UTF-8"));
		if (null != json) {
			if (json.get("errmsg").equals("ok")) {
				if (null != json.get("ticket")) {
					return (String) json.get("ticket");
				}
			}
		}
		return null;
	}

	/**
	 * 获取用户openID
	 * @author hongyang.jiang
	 */
	public static String getOpenId(String code,String appId,String appSecret) {
		if (code != null) {
			String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
					+ "appid=" +appId + "&secret="
					+appSecret + "&code=" + code
					+ "&grant_type=authorization_code";
			String returnData = getReturnData(url);
			Gson gson = new Gson();
			OpenIdClass openIdClass = gson.fromJson(returnData,
					OpenIdClass.class);
			if (openIdClass.getOpenid() != null) {
				return openIdClass.getOpenid();
			}
		}
		return "error";
	}

	public static String getReturnData(String urlString) {
		String res = "";
		try {
			URL url = new URL(urlString);
			java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url
					.openConnection();
			conn.connect();
			java.io.BufferedReader in = new java.io.BufferedReader(
					new java.io.InputStreamReader(conn.getInputStream(),
							"UTF-8"));
			String line;
			while ((line = in.readLine()) != null) {
				res += line;
			}
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}

	/**
	 * 回调request 参数解析为map格式
	 * @author hongyang.jiang
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, String> parseXml(HttpServletRequest request)
			throws Exception {
		// 解析结果存储在HashMap
		Map<String, String> map = new HashMap<String, String>();
		InputStream inputStream = request.getInputStream();
		// 读取输入流
		SAXReader reader = new SAXReader();
		Document document = reader.read(inputStream);
		// 得到xml根元素
		Element root = document.getRootElement();
		// 得到根元素的所有子节点
		List<Element> elementList = root.elements();
		// 遍历所有子节点
		for (Element e : elementList)
			map.put(e.getName(), e.getText());
		// 释放资源
		inputStream.close();
		inputStream = null;
		return map;
	}
}
